package br.ufrj.dcc.ad.simulador;

import java.util.ArrayList;
import java.util.List;

import br.ufrj.dcc.ad.cliente.Cliente;
import br.ufrj.dcc.ad.criterioParada.CriterioDeParada;
import br.ufrj.dcc.ad.servidor.Servidor;

public abstract class Simulador {
	protected List<Cliente> clientesAtendidos;
	protected CriterioDeParada criterioDeParada;
	protected Servidor servidor;
	protected double tempoDecorridoDesdeInicioSimulacao;
	
	public Simulador(CriterioDeParada criterioDeParada, Servidor servidor){
		this.criterioDeParada = criterioDeParada;
		this.clientesAtendidos = new ArrayList<Cliente>();
		this.servidor = servidor;
		this.tempoDecorridoDesdeInicioSimulacao = 0.0;
	}

	public final void simula(){
		while(!this.criterioDeParada.serahQueDevemosParar()){
			Cliente novoCliente = this.geraCliente();
			this.trataCliente(novoCliente);
			
			this.criterioDeParada.atualiza();
		}
	}
	
	protected abstract Cliente geraCliente();
	protected abstract void trataCliente(Cliente cliente);

	public List<Cliente> getClientesAtendidos() {
		return clientesAtendidos;
	}

	public void setClientesAtendidos(List<Cliente> clientesAtendidos) {
		this.clientesAtendidos = clientesAtendidos;
	}

	public CriterioDeParada getCriterioDeParada() {
		return criterioDeParada;
	}

	public void setCriterioDeParada(CriterioDeParada criterioDeParada) {
		this.criterioDeParada = criterioDeParada;
	}

	public Servidor getServidor() {
		return servidor;
	}

	public void setServidor(Servidor servidor) {
		this.servidor = servidor;
	}

	public double getTempoDecorridoDesdeInicioSimulacao() {
		return tempoDecorridoDesdeInicioSimulacao;
	}
	

	

}
